home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
Blogowanie poza sfera
/
Flock 1.0 beta
/
flock-1.0RC3.en-US.win32.exe
/
flock
/
components
/
flockRemoteConsoleLogger.js
< prev
next >
Wrap
Text File
|
2007-10-18
|
7KB
|
260 lines
// vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
//
// BEGIN FLOCK GPL
//
// Copyright Flock Inc. 2005-2007
// http://flock.com
//
// This file may be used under the terms of of the
// GNU General Public License Version 2 or later (the "GPL"),
// http://www.gnu.org/licenses/gpl.html
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
//
// END FLOCK GPL
//
const CL_CONTRACTID = '@flock.com/remote-console-logger;1';
const CL_CLASSID = Components.ID('{70dc2acf-7e36-4a43-8f28-3e5f70613428}');
const CL_CLASSNAME = 'Flock Remote Console Logger';
const ENABLED_BY_DEFAULT = false;
const LOGGING_URL = "http://exceptions.flock.com/log";
const PREF_FLOCK_LOG_ERRORS = "flock.remote_logging";
const PREF_FLOCK_FIRSTRUN_UUID = "flock.firstrun.uuid";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
gApp = null;
gConsole = null;
function getObserverService() {
return Cc['@mozilla.org/observer-service;1']
.getService(Ci.nsIObserverService);
}
function RemoteConsoleLogger() {
gApp = Cc['@mozilla.org/xre/app-info;1']
.getService(Ci.nsIXULAppInfo)
.QueryInterface(Ci.nsIXULRuntime);
gConsole = Cc['@mozilla.org/consoleservice;1']
.getService(Ci.nsIConsoleService);
this._registered = false;
this._listener = {
logger: this,
observe: function CLL_observe(obj) { this.logger._log(obj) }
};
var obs = getObserverService();
obs.addObserver(this, 'profile-after-change', false);
obs.addObserver(this, 'xpcom-shutdown', false);
if (ENABLED_BY_DEFAULT)
this.observe(null, 'nsPref:changed', null);
}
RemoteConsoleLogger.prototype = {
_start: function CL__start() {
var prefs = Cc['@mozilla.org/preferences-service;1']
.getService(Ci.nsIPrefBranch2);
prefs.addObserver(PREF_FLOCK_FIRSTRUN_UUID, this, false);
prefs.addObserver(PREF_FLOCK_LOG_ERRORS, this, false);
this.observe(null, 'nsPref:changed', null);
},
_configure: function CL__configure() {
var prefs = Cc['@mozilla.org/preferences-service;1']
.getService(Ci.nsIPrefBranch);
var enabled;
try {
enabled = prefs.getBoolPref(PREF_FLOCK_LOG_ERRORS);
}
catch (e) {
/* disable by default always for dev builds */
if (gApp.appBuildID == '0000000000')
enabled = false;
else
enabled = ENABLED_BY_DEFAULT;
}
var metrics = Cc["@flock.com/metrics-service;1"]
.getService(Ci.flockIMetricsService);
this._preamble = gApp.appBuildID + " " + metrics.getUserUUID() + "\n";
if (enabled && !this._registered)
this._registerListener()
else if (!enabled && this._registered)
this._unregisterListener()
},
_shutdown: function CL__shutdown() {
gApp = null;
gConsole = null;
},
_registerListener: function CL__registerListener() {
try {
gConsole.registerListener(this._listener);
this._registered = true;
}
catch (e) {
debug("Couldn't register with console service: " + e + "\n");
}
},
_unregisterListener: function CL__unregisterListener() {
try {
gConsole.unregisterListener(this._listener);
this._registered = false;
}
catch (e) {
debug("Couldn't unregister with console service: " + e + "\n");
}
},
_log: function CL__log(message) {
try {
var scriptError = message.QueryInterface(Ci.nsIScriptError);
if (scriptError.sourceName.indexOf('http:') != -1 ||
scriptError.sourceName.indexOf('https:') != -1)
return;
var hr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
.createInstance(Ci.nsIXMLHttpRequest);
hr.backgroundRequest = true;
hr.open('POST', LOGGING_URL);
hr.send(this._preamble + scriptError.toString() + '\n');
}
catch (e) {
// Something bad happened, just ignore it
}
},
observe: function CL_observe(subject, topic, state) {
var obs = getObserverService();
switch (topic) {
case 'profile-after-change':
obs.removeObserver(this, 'profile-after-change');
this._start();
break;
case 'xpcom-shutdown':
obs.removeObserver(this, 'xpcom-shutdown');
this._shutdown();
break;
case 'nsPref:changed':
this._configure();
break;
}
},
getInterfaces: function CL_getInterfaces(countRef) {
var interfaces = [Ci.nsIObserver, Ci.nsIClassInfo, Ci.nsISupports];
countRef.value = interfaces.length;
return interfaces;
},
getHelperForLanguage: function CL_getHelperForLanguage(language) {
return null;
},
contractID: CL_CONTRACTID,
classDescription: CL_CLASSNAME,
classID: CL_CLASSID,
implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
flags: Ci.nsIClassInfo.SINGLETON,
QueryInterface: function CL_QueryInterface(iid) {
if (iid.equals(Ci.nsIObserver) ||
iid.equals(Ci.nsIClassInfo) ||
iid.equals(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
}
}
function GenericComponentFactory(ctor) {
this._ctor = ctor;
}
GenericComponentFactory.prototype = {
_ctor: null,
// nsIFactory
createInstance: function(outer, iid) {
if (outer != null)
throw Cr.NS_ERROR_NO_AGGREGATION;
return (new this._ctor()).QueryInterface(iid);
},
// nsISupports
QueryInterface: function(iid) {
if (iid.equals(Ci.nsIFactory) ||
iid.equals(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
};
var Module = {
QueryInterface: function(iid) {
if (iid.equals(Ci.nsIModule) ||
iid.equals(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
getClassObject: function(cm, cid, iid) {
if (!iid.equals(Ci.nsIFactory))
throw Cr.NS_ERROR_NOT_IMPLEMENTED;
if (cid.equals(CL_CLASSID))
return new GenericComponentFactory(RemoteConsoleLogger)
throw Cr.NS_ERROR_NO_INTERFACE;
},
registerSelf: function(cm, file, location, type) {
var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
cr.registerFactoryLocation(CL_CLASSID, CL_CLASSNAME, CL_CONTRACTID,
file, location, type);
var catman = Cc['@mozilla.org/categorymanager;1']
.getService(Ci.nsICategoryManager);
catman.addCategoryEntry('app-startup', CL_CLASSNAME,
'service,' + CL_CONTRACTID,
true, true);
},
unregisterSelf: function(cm, location, type) {
var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
cr.unregisterFactoryLocation(CL_CLASSID, location);
},
canUnload: function(cm) {
return true;
},
};
function NSGetModule(compMgr, fileSpec)
{
return Module;
}